home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr44 / frasrc19.zip / BIGNUM.H < prev    next >
C/C++ Source or Header  |  1995-01-16  |  5KB  |  149 lines

  1. /* bignum.h */
  2. /* Wesley Loewer's Big Numbers.        (C) 1994, Wesley B. Loewer */
  3.  
  4. #ifndef _BIGNUM_H
  5. #define _BIGNUM_H
  6.  
  7. /*
  8. use 0 to indicate no bf_math
  9.     1 to indicate either type
  10.     BIGNUM for explicitly big integer
  11.     BIGFLT for explicitly big float
  12. */
  13.  
  14. #ifndef PORT_H
  15. #include "port.h"
  16. #endif
  17.  
  18. typedef unsigned char far * bn_t;  /* use this for dynamic allocation */
  19.  
  20. extern int fpu;
  21. extern int cpu;
  22. extern int tim;
  23.  
  24. #define MATHBITS      32
  25. #define MATHBYTES     (MATHBITS/8)
  26. #define NUMVARS       30            /* room for this many on stack */
  27. #define CURRENTREZ    1
  28. #define MAXREZ        0
  29.  
  30. struct BFComplex
  31. {
  32.    bn_t x;
  33.    bn_t y;
  34. };
  35. typedef struct BFComplex   _BFCMPLX;
  36.  
  37. struct BNComplex
  38. {
  39.    bn_t x;
  40.    bn_t y;
  41. };
  42. typedef struct BNComplex   _BNCMPLX;
  43.  
  44. #ifdef BIG_ENDIAN /* Big Endian: &variable == &(most significant byte), moterola style */
  45. /* prototypes */
  46. U32 access32(BYTE far *addr);
  47. U16 access16(BYTE far *addr);
  48. S16 accessS16(S16 far *addr);
  49. U32 set32(BYTE far *addr, U32 val);
  50. U16 set16(BYTE far *addr, U16 val);
  51. S16 setS16(S16 far *addr, S16 val);
  52.  
  53. #else /* Little Endian: &variable == &(least significant byte), intel style */
  54. /* equivalent defines */
  55. #define access32(addr)   (*(U32 far *)(addr))
  56. #define access16(addr)   (*(U16 far *)(addr))
  57. #define accessS16(addr)   (*(S16 far *)(addr))
  58. #define set32(addr, val) (*(U32 far *)(addr) = (U32)(val))
  59. #define set16(addr, val) (*(U16 far *)(addr) = (U16)(val))
  60. #define setS16(addr, val) (*(S16 far *)(addr) = (S16)(val))
  61. #endif
  62.  
  63.  
  64.  
  65. /* globals */
  66. extern int bnstep, bnlength, intlength, rlength, padding, shiftfactor, decimals;
  67. extern int bflength, rbflength, bfpadding, bfdecimals;
  68.  
  69. extern int bf_math;
  70.  
  71. extern bn_t bn_pi;
  72. extern bn_t bnxmin, bnxmax, bnymin, bnymax, bnx3rd, bny3rd;      /* bnlength */
  73. extern bn_t bnsxmin, bnsxmax, bnsymin, bnsymax, bnsx3rd, bnsy3rd;/* bnlength */
  74. extern bn_t bnxdel, bnydel, bnxdel2, bnydel2, bnclosenuff;       /* bnlength */
  75. extern bn_t bntmpsqrx, bntmpsqry, bntmp;                         /* rlength  */
  76. extern bn_t bftmpsqrx, bftmpsqry, bftmp;                         /* rlength  */
  77. extern _BFCMPLX bfold, bfnew, bfparm;                            /* bnlength */
  78. extern _BNCMPLX bnold, bnnew, bnparm, bnsaved;                   /* bnlength */
  79. extern bn_t bnparms[];                                           /* bnlength*10 */
  80.  
  81.  
  82. /* functions defined in bignuma.asm or bignumc.c */
  83. extern bn_t clear_bn(bn_t r);
  84. extern bn_t max_bn(bn_t r);
  85. extern bn_t copy_bn(bn_t r, bn_t n);
  86. extern int cmp_bn(bn_t n1, bn_t n2);
  87. extern int is_bn_neg(bn_t n);
  88. extern int is_bn_not_zero(bn_t n);
  89. extern bn_t add_bn(bn_t r, bn_t n1, bn_t n2);
  90. extern bn_t add_a_bn(bn_t r, bn_t n);
  91. extern bn_t sub_bn(bn_t r, bn_t n1, bn_t n2);
  92. extern bn_t sub_a_bn(bn_t r, bn_t n);
  93. extern bn_t neg_bn(bn_t r, bn_t n);
  94. extern bn_t neg_a_bn(bn_t r);
  95. extern bn_t double_bn(bn_t r, bn_t n);
  96. extern bn_t double_a_bn(bn_t r);
  97. extern bn_t half_bn(bn_t r, bn_t n);
  98. extern bn_t half_a_bn(bn_t r);
  99. extern bn_t unsafe_full_mult_bn(bn_t r, bn_t n1, bn_t n2);
  100. extern bn_t unsafe_mult_bn(bn_t r, bn_t n1, bn_t n2);
  101. extern bn_t unsafe_full_square_bn(bn_t r, bn_t n);
  102. extern bn_t unsafe_square_bn(bn_t r, bn_t n);
  103. extern bn_t mult_bn_int(bn_t r, bn_t n, U16 u);
  104. extern bn_t mult_a_bn_int(bn_t r, U16 u);
  105. extern bn_t unsafe_div_bn_int(bn_t r, bn_t n, U16 u);
  106. extern bn_t div_a_bn_int(bn_t r, U16 u);
  107.  
  108.  
  109. /* functions defined in bignum.c */
  110. extern void bn_hexdump(bn_t r);
  111. extern bn_t strtobn(bn_t r, char *s);
  112. extern char *unsafe_bntostr(char *s, int dec, bn_t r);
  113. extern bn_t inttobn(bn_t r, long longval);
  114. extern long bntoint(bn_t n);
  115. extern bn_t floattobn(bn_t r, LDBL f);
  116.  
  117. extern int  sign_bn(bn_t n);
  118. extern bn_t abs_bn(bn_t r, bn_t n);
  119. extern bn_t abs_a_bn(bn_t r);
  120. extern bn_t unsafe_inv_bn(bn_t r, bn_t n);
  121. extern bn_t unsafe_div_bn(bn_t r, bn_t n1, bn_t n2);
  122. extern bn_t sqrt_bn(bn_t r, bn_t n);
  123. extern bn_t exp_bn(bn_t r, bn_t n);
  124. extern bn_t unsafe_ln_bn(bn_t r, bn_t n);
  125. extern bn_t unsafe_sincos_bn(bn_t s, bn_t c, bn_t n);
  126. extern bn_t unsafe_atan_bn(bn_t r, bn_t n);
  127. extern bn_t unsafe_atan2_bn(bn_t r, bn_t ny, bn_t nx);
  128. extern int convert_bn(bn_t new,bn_t old,int newbnlength,int newintlength,int oldbnlength,int oldintlength);
  129.  
  130.     /* "safe" versions */
  131. extern bn_t full_mult_bn(bn_t r, bn_t n1, bn_t n2);
  132. extern bn_t mult_bn(bn_t r, bn_t n1, bn_t n2);
  133. extern bn_t full_square_bn(bn_t r, bn_t n);
  134. extern bn_t square_bn(bn_t r, bn_t n);
  135. extern bn_t div_bn_int(bn_t r, bn_t n, U16 u);
  136. extern char *bntostr(char *s, int dec, bn_t r);
  137. extern LDBL bntofloat(bn_t n);
  138. extern bn_t inv_bn(bn_t r, bn_t n);
  139. extern bn_t div_bn(bn_t r, bn_t n1, bn_t n2);
  140. extern bn_t ln_bn(bn_t r, bn_t n);
  141. extern bn_t sincos_bn(bn_t s, bn_t c, bn_t n);
  142. extern bn_t atan_bn(bn_t r, bn_t n);
  143. extern bn_t atan2_bn(bn_t r, bn_t ny, bn_t nx);
  144.  
  145.     /* misc */
  146. extern int is_bn_zero(bn_t n);
  147.  
  148. #endif
  149.